perm filename DECMAN[S,AIL] blob
sn#000801 filedate 1971-11-03 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00045 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00011 00002
00015 00003 SAILON NO. 57.1 SAIL 2-0
00017 00004 SAILON NO. 57.1 SAIL 2-0.5
00018 00005 SAILON NO. 57.1 SAIL 3-7.5
00019 00006 SAILON NO. 57.1 SAIL 3-18.5
00020 00007 SAILON NO. 57.1 SAIL 3-20.5
00022 00008 SAILON NO. 57.1 SAIL 5-8.5
00024 00009 SAILON NO. 57.1 SAIL 9-7.5
00025 00010 SAILON NO. 57.1 SAIL 9-11
00028 00011 SAILON NO. 57.1 SAIL 9-12
00031 00012 SAILON NO. 57.1 SAIL 9-13
00035 00013 SAILON NO. 57.1 SAIL 9-14
00039 00014 SAILON NO. 57.1 SAIL 9-15
00042 00015 SAILON NO. 57.1 SAIL 9-15.5
00046 00016 SAILON NO. 57.1 SAIL 11-3
00051 00017 SAILON NO. 57.1 SAIL 11-4
00053 00018 SAILON NO. 57.1 SAIL 11-4.5
00055 00019 SAILON NO. 57.1 SAIL 12-0
00057 00020 SAILON NO. 57.1 SAIL 12-3
00061 00021 SAILON NO. 57.1 SAIL 12-4
00064 00022 SAILON NO. 57.1 SAIL 12-4.5
00067 00023 SAILON NO. 57.1 SAIL 12-7.5
00068 00024 SAILON NO. 57.1 SAIL 12-13.5
00070 00025 SAILON NO. 57.1 SAIL 12-27
00073 00026 SAILON NO. 57.1 SAIL 12-28
00075 00027 SAILON NO. 57.1 SAIL 12-28.5
00078 00028 SAILON NO. 57.1 SAIL 12-32.5
00079 00029 SAILON NO. 57.1 SAIL 12-34.5
00082 00030 SAILON NO. 57.1 SAIL 14-6.5
00084 00031 SAILON NO. 57.1 SAIL 18-1
00087 00032 SAILON NO. 57.1 SAIL 18-2
00090 00033 SAILON NO. 57.1 SAIL 18-3
00091 00034 SAILON NO. 57.1 SAIL 18-4
00092 00035 SAILON NO. 57.1 SAIL 18-5
00094 00036 SAILON NO. 57.1 SAIL 18-6
00095 00037 SAILON NO. 57.1 SAIL 18-7
00098 00038 SAILON NO. 57.1 SAIL 18-8
00099 00039 SAILON NO. 57.1 SAIL 18-9
00102 00040 SAILON NO. 57.1 SAIL 18-10
00106 00041 SAILON NO. 57.1 SAIL 18-11
00108 00042
00111 00043
00114 00044
00118 00045
00120 ENDMK
⊗;
COVER LETTER TO USERS OF THE DECUS-DISTRIBUTED SAIL
This manual comprises four documents: the SAIL manual (SAIL.ON),
a description of recent changes (NEWMAN), an implementation
guide (TELLEM, the "SAILmaker's Guide"), and a manual describing
the FAIL assembler (FAIL.ON). The user of SAIL should only have
to be concerned with the first two. The latter reports should
be read FIRST by anyone responsible for installation or
maintainance of SAIL. TELLEM, in particular, hopefully provides
an adequate description of the procedures necessary for installing
or modifying any part of the SAIL system.
The SAIL manual was originally written as a reference for those
already familiar with ALGOL60, and to some extent with SAIL.
It will not be comprehensible to anyone who is tackling Algol-like
languages for the first time. In addition, the organization of
sections is not conducive to an easy first reading. the suggested
order of approach (the first time only, is):
a). Read Section 11, on basic constructs (identifiers,
numbers, reserved words, and the like).
b). Section 9, on expressions.
c). Sections 4 and 5, statements.
d). Sections 2 and 3, block structure and declarations.
e). The remaining sections in numerical order, skipping
LEAPish chapters for now if you desire.
Even in this case, there will be some forward references, but this
should introduce the maximum number of terms before they are used.
The system is ideally distributed on 7-track magnetic tape. In
this case you will also receive a paper tape with a MACRO program
on it which will enable you to get the files off the magtape (see
TELLEM). The names mentioned above are the file names of these
documents, which are duplicated on the tape. The distribution tape
contains .REL files to get you started, as well as text files for all
parts of the system.
The system can also be obtained on DECtape, although you may not
receive all of the marginally useful files, which are thrown in
on the magtape simply because there's room and they might help.
Best of luck with SAIL. Please don't hesitate to report bugs
or problems to DECUS. If all else fails, we are available for
telephone or mail consultation at the address given on the cover.
SAILON NO. 57.1 SAIL 2-0
SYNTAX CHANGES
2-0.
The following changes should be applied to the syntax specifications
in the specified paragraphs.
In paragraph 3-1, add
<declaration> ::= <synonym_declaration>
<type_qualifier> ::= SHORT
<synonym_declaration> ::= LET <synonym_list>
<synonym_list> ::= <synonym>
::= <synonym_list> , <synonym>
<synonym> ::= <identifier> = <reserved_word>
<space_spec> ::= PNAMES
<relfile_spec> ::= SOURCE_FILE
In paragraph 3-1, remove
<require_element> ::= PNAMES
In paragraph 5-1, change
<case_statement> ::= <case_statement_head> <compound_tail>
::= <case_statement_head> <selected_tail>
<case_statement_head> ::= CASE <algebraic_expression> OF BEGIN
::= CASE <algebraic_expression> OF
BEGIN <block_name>
and add
<selected_tail> ::= <selected_statement> END
::= <selected_statement> END <block_name>
::= <selected_statement> ; <selected_tail>
<selected_statement> ::= [ <constant_expression> ] <statement>
SAILON NO. 57.1 SAIL 2-0.5
In paragraph 9-1, change
<algebraic_relational> ::= <bounded_expression>
::= <algebraic_relational>
<relational_operator>
<bounded_expression>
then add
<bounded_expression> ::= <adding_expression>
::= <bounded_expression> MAX
<adding_expression>
::= <bounded_expression> MIN
<adding_expression>
In paragraph 14-1, add
<valid_switch_name> ::= K
::= H
SAILON NO. 57.1 SAIL 3-7.5
3-13.5. SHORT Integers and Reals may take on values between -2↑27
and 2↑27-1 (the limit imposed by the FSC instruction). See section
9-23 and following for use of SHORT values.
SAILON NO. 57.1 SAIL 3-18.5
Synonyms
3-54.5 The declaration `LET BEG=BEGIN' would tell the compiler that
BEG is now a reserved word with the same meaning as BEGIN. BEGIN can
subsequently be DEFINEd or declared as something else without
eliminating the opening of new blocks (use BEG for BEGIN). This
synonymity applies only over the scope of the declaration, as usual.
SAILON NO. 57.1 SAIL 3-20.5
3-58.5. (Replaces paragraph 3-57) "REQUIRE 100 PNAMES" will allow up
to 100 print names to be dynamically assigned to items (see Cvis,
New_Pname). PNAMES are not available at all (for declared items or
otherwise), unless some number are "REQUIRE"d.
3-61.3. The inclusion of REQUIRE "SYS:PREAMB.SAI" SOURCE_FILE (or,
perhaps, ... "PREAMB.SAI[1,3]" ...) will cause the compiler to save
the state of the current input file, then begin scanning from PREAMB.
When PREAMB is exhausted, SAIL will resume scanning the original file
on the line directly following the REQUIRE. SOURCE_FILEs may be
nested to a depth of about 10 levels.
3-61.6. Restrictions: A SOURCE_FILE request must be followed by a
semicolon (only one per REQUIREment), and must be the last text on
the line in which it appears. SOURCE_FILE switching must not be
specified from within a DEFINE body.
SAILON NO. 57.1 SAIL 5-8.5
5-18.3. The <selected_tail> form of the CASE statement is provided
to aid the creation of Case selection when the code used to select
an alternative is arbitrary, perhaps even symbolically defined. The
statement
CASE AE OF BEGIN
[3] S3; [0] S0; [n] Sn; ... [1] S1
END
will have the same result as the example in paragraph 5-18, provided
n is the largest expression to appear between brackets. If for some
i (0 ≤ i ≤ n) no entry appears, executions of the statement selecting
these cases will have no effect (dummy statements).
5-18.6. This construct, in other words, allows the explicit ordering
of statements within a CASE statement.
5-18.9. If a block name appears after the BEGIN, as described in the
new syntax, paragraph 2-0, then any name appearing after the matching
END will be checked for equality to the BEGIN name, as with blocks and
compound statements.
SAILON NO. 57.1 SAIL 9-7.5
9-13.5 MAX and MIN have a precedence higher than (are performed
before) ∧, but lower than + (see Bounded Expressions).
SAILON NO. 57.1 SAIL 9-11
9-22.
OPERATION ARG1 ARG2 ARG1' ARG2' RESULT
+ - INT INT INT INT INT*
* ↑ % REAL INT REAL REAL REAL
MAX MIN INT REAL REAL REAL REAL
REAL REAL REAL REAL REAL
LAND LOR INT INT INT INT INT
EQV XOR REAL INT REAL INT REAL
INT REAL INT REAL INT
REAL REAL REAL REAL REAL
LSH ROT INT INT INT INT INT
REAL INT REAL INT REAL
INT REAL INT INT INT
REAL REAL REAL INT REAL
/ INT INT REAL REAL REAL
REAL INT REAL REAL REAL
INT REAL REAL REAL REAL
REAL REAL REAL REAL REAL
MOD DIV INT INT INT INT INT
REAL INT INT INT INT
INT REAL INT INT INT
REAL REAL INT INT INT
* Unless ARG2 is <0 for the operator ↑
9-23. An Integer is converted to a Real number in such a way that
if this Real number is converted back to an Integer, the same Integer
value will result, unless the absolute value of the number is greater
than 134217728. Some low-order significance will be lost for
integers greater than this magnitude.
9-23.5 If the Integer is a SHORT INTEGER variable, or the Real is
SHORT REAL, the conversion is done with a FSC instruction, much more
efficiently (a factor of about 8) than the normal UUO.
SAILON NO. 57.1 SAIL 9-12
9-24. A Real number is converted to an Integer using the following
formula:
Integer ← SIGN(Real)*{largest integer I such that I≤ABS(Real)}.
This function will produce invalid results for Real numbers with a
magnitude greater than 134217728.
9-25. If a String is presented as an argument to any of these
operations, it is converted to an Integer. If an Integer or Real
argument is presented to the concatenation operator (&), it is
converted to a one-character string. Here are the rules:
String-Arithmetic Conversions
9-26. If a String is presented as an argument to an arithmetic
operator, as a (value) parameter to a procedure which expects a Real
or Integer value, or as an expression to be stored by an assignment
statement into a Real or Integer variable, an Integer value is
created for it as follows:
If the string is the null string (length=0), a 0 is returned as
its `Integer value'. Otherwise a word which has its lefthand 29 bits
0, the rightmost 7 bits containing the first character of the String,
is returned as its `Integer value'. For instance, the String "ABCDE"
has as its `Integer value' '101, the octal representation of the
letter `A'. This Integer will then be converted to a Real number, if
necessary.
SAILON NO. 57.1 SAIL 9-13
9-27. If an Integer or Real number is presented where a String is
expected, a one character String will be created whose character
consists of bits 29-35 (the rightmost seven bits) of the numeric
value. A Real number is not converted to an Integer before the
conversion. For instance, the expression
"STRING"& '15 & '12
will result in a String which is 8 characters long. The last two
characters are the ASCII codes for carriage return and line feed,
respectively.
Bounded Expressions
9-27.5 A MAX B (where A and B are appropriate expressions -- see
the Syntax) has the value of the larger of A and B (in the algebraic
sense). Type conversions are performed as if the operator were `+'.
0 MAX X MIN 10 is X if 0≤X≤10, 0 if X<0, 10 if X>10.
Adding Expressions
9-28. All the operators grouped in the semantic class
<add_operator> operate at the same precedence level. The user must
sometimes provide parentheses in order to make the meaning of such
expressions absolutely unambiguous. The + and - operators will do
integer addition (subtraction) if both arguments are integers (or
converted to integers from strings); otherwise, rounded Real addition
or subtraction, after necessary conversions, is done.
9-29. LAND, LOR, XOR, and EQV carry out bit-wise And, Or,
Exclusive Or, and Equivalence operations on their arguments. No type
conversions are done for these functions. The logical connectives ∧
and ∨ do not have this effect -- they simply cause tests and jumps to
be compiled. The type of the result is that of the first operand.
This allows expressions of the form X LAND '777777777, where X is
Real, if they are really desired.
9-30. Currently the values of the various overflow flags produced
by these operators (and those which follow) are not available to the
user.
SAILON NO. 57.1 SAIL 9-14
Terms
Arithmetic Multiplicative Operators
9-31. The operation * (multiplication), like + and -, represents
Integer multiplication only if both arguments are integers; Real
otherwise. Integer multiplication uses the IMUL machine instruction
-- no double-length result is available.
9-32. The / operator (division) always does rounded Real division,
after converting any Integer arguments to Real.
9-33. The % operator has the same type table as +, -, and *. It
performs whatever division is appropriate.
9-34. LSH and ROT provide logical shift operations on their first
arguments. If the value of the second argument is positive, a shift
or rotation of that many bits to the left is performed. If it is
negative, a right-shift or rotate is done. To obtain an arithmetic
shift (ASH) operation, multiply or divide by the appropriate power of
2; the compiler will change this operation to a shift operation.
9-35. DIV and MOD force both arguments to be integers before
dividing. X MOD Y is the remainder after X DIV Y is performed
(X MOD Y = X - (X DIV Y)*Y);
Concatenation Operator
9-36. This operator produces a result of type String. It is the
String with length the sum of the lengths of its arguments,
containing all the characters of the second string concatenated to
the end of all the characters of the first. The operands will first
be converted to strings if necessary as described in
String-Arithmetic Conversions, 9-27 above. The normal use of the &
operator is to collect lines of text, from several other string
sources, which will subsequently be sent to an output device.
Numbers can be converted to strings representing their external forms
(and vice-versa) through explicit calls on execution time routines
like CVS and CVD (see Execution Routines, 12-1 below).
SAILON NO. 57.1 SAIL 9-15
Factors
9-37. A factor is either a primary or a primary raised to a power
represented by another primary. As usual, evaluation is from left to
right, so that A↑B↑C is evaluated as (A↑B)↑C. In the factor X↑Y, a
suitable number of multiplications and additions is performed to
produce an "exact" answer if Y is a positive integer. Otherwise a
routine is called to approximate ANTILOG(Y LOG X). The result has
the type of X in the former case. It is always of type Real in the
latter.
Primaries
9-38. A primary represents an arithmetic or String value which
always acts as a unit in any binary operation. It is either an
expression surrounded by parentheses which indicates that all
internal operations should be performed before combining it with
other things, or one of myriad other constructs which will be
considered separately.
Variables and Constants
9-39. These are clearly primary objects. They are values
contained in specific core locations, or in parameter stacks, or in
the case of some numeric constants, they are immediate operands.
Substrings
9-40. A String primary which is qualified by a substring
specification represents a part of the specified string. ST[X FOR Y]
represents the Xth through the (X + Y - 1)th characters of the String
ST. ST[X TO Y] represents the Xth through Yth characters of ST.
SAILON NO. 57.1 SAIL 9-15.5
9-40.2. Consider the ST[X TO Y] case. If Y>LENGTH(ST), Y←LENGTH(ST).
if Y<0, Y←0; in either case the right half of the global Integer
_SKIP_ is set to TRUE. If X ≤ 1 it is set to 1. If X > (the
modified) Y, it is set to Y+1 (null string guaranteed). In either
case the left half of _SKIP_ is made TRUE. The ST[X FOR Y] operation
is converted to the ST[X TO Y] case before the substring operation is
performed.
9-40.4. To examine the above conditions, declare EXTERNAL INTEGER
_SKIP_, and look at it after any interesting substring operation.
Special Length Operator (∞)
9-41. This special primary construct is valid only within
substring brackets. It is an algebraic value representing the length
of the most immediate string under consideration.
Example:
9-42.
A[4 to ∞] throws out the first 3 characters of A.
A[3 for B[∞-1 for 1]] uses the next to the last character
of string B as the number of characters
for the A substring operation.
Function Designators
9-43. A function designator defines a single value. This value is
produced by the execution of a typed user Procedure or of a typed
execution-time routine (Execution Routines, 12-1). For a function
designator to be an algebraic primary, its Procedure must be declared
to have an algebraic type. Untyped Procedures may only be called
from Procedure statements (see Procedure Statements, 6-2). The value
obtained from a user-defined Procedure is that provided by a Return
Statement within that Procedure. If the Procedure does not execute a
Return Statement, the value might be anything at all. A Return
Statement in a typed Procedure must mention a value (see Return
Statement, 5-20).
9-44. The rules for supplying actual parameters in a function
designator are identical to those for supplying parameters in a
procedure statement (see Procedure Statements, 6-2).
SAILON NO. 57.1 SAIL 11-3
11-8. A SAIL letter is any of the upper or lower case letters A
through Z, or the underline character (_ or !, they are treated
equivalently). Lower case letters are mapped into the corresponding
upper case letters for purposes of symbol table comparisons (SCHLUFF
is the same symbol as Schluff). A digit is any of the characters 0
through 9. An identifier is a string of characters consisting of a
letter followed by virtually any number of letters and digits There
must be a character which is neither a letter nor a digit (nor either
of the characters "." or "$") both before and after every identifier.
In other words, if YOU can't determine where one identifier ends and
another begins in a program you have never seen before, well, neither
can SAIL.
11-9. There is a set of identifiers which are used as SAIL
delimiters (in the Algol sense -- that is, BEGIN is treated by Algol
as if it were a single character. Such an approach is not practical,
so a reserved identifier is used). These identifiers are called
Reserved Words and may not be used for any purpose other than those
given explicitly in the syntax, or in declarations (DEFINES) which
mask their reserved-word status over the scope of the declarations.
E.g., "INTEGER BEGIN" is allowed, but a Synonym (see Synonyms, 3-55)
should have been provided for BEGIN if any new blocks are desired
within this one, because BEGIN is ONLY an Integer in this block.
Another set of identifiers have preset declarations -- these are the
execution time functions. These latter identifiers may also be
redefined by the user; they behave as if they were declared in a
block surrounding the outer block. A list of reserved and
predeclared identifiers follows:
Sail Reserved Words
11-10.
ABS AND ANY ARRAY ARRAY_PDL ASSOC BBPP BEGIN BOOLEAN CASE COMMENT
CONTINUE COP CVI CVN DATUM DEFINE DELETE DIV DO DONE DPB ELSE END
ENTRY EQV ERASE EXTERNAL FALSE FIRST FOR FOREACH FORTRAN FORWARD FROM
GEQ GO GOTO IBP IDPB IF ILDB IN INF INTEGER INTER INTERNAL ISTRIPLE
ITEM ITEMVAR LABEL LAND LDB LENGTH LEQ LET LIBRARY LOAD_MODULE LNOT
LOP LOR LSH MAKE MAX MIN MOD NEEDNEXT NEQ NEXT NEW NEW_ITEMS NOT NULL
OF OR OWN PHI PNAMES PRELOAD_WITH PROCEDURE PUT QUICK_CODE REAL
RECURSIVE REFERENCE REMOVE REQUIRE RETURN ROT SAFE SECOND SET SETC
SETO SHORT SOURCE_FILE START_CODE STEP STRING STRING_PDL STRING_SPACE
SUCH SYSTEM_PDL THAT THEN THIRD TO TRUE UNTIL VALUE WHILE XOR
SAILON NO. 57.1 SAIL 11-4
11-10.5 Those who use Stanford's "Global Model" compiler will also
recognize:
GLOBAL MESSAGE SEGMENT_FILE SEGMENT_NAME
Sail Predeclared Identifiers
11-11.
ARRBLT ARRINFO ARRTRAN ARRYIN ARRYOUT BREAKSET CALL CLOSE CLOSIN
CLOSO CLRBUF CODE CVASC CVD CVE CVF CVFIL CVG CVIS CVO CVOS CVS CVSI
CVSIX CVSTR CVXSTR ENTER EQU FILEINFO GETCHAN GETFORMAT INCHRW INCHRS
INCHSL INCHWL INSTR INSTRL INSTRS INPUT INTIN INTSCAN LINOUT LOOKUP
MTAPE OPEN OUT OUTCHR OUTSTR REALIN REALSCAN RELEASE RENAME SCAN
SETBREAK SETFORMAT STRBRK TTYIN TTYINL TTYINS WORDIN WORDOUT USERCON
USERERR USETI USETO
11-11.5 These apply only to Stanford users (especially "Global
Model" users): BACKUP GET_BIT GET_DATA GET_ENTRY IFGLOBAL ISSUE LODED
PTCHRS PTCHRW PTIFRE PTOCNT PTOCHS PTOCHW PTOSTR PTYALL PTYGET PTYIN
PTYREL PTYSTR PUT_DATA QUEUE
SAILON NO. 57.1 SAIL 11-4.5
11-12.5 Some of the reserved words are equivalent to certain
special characters. These equivalences are:
CHARACTER RESERVED WORD (s)
∧ AND
≡ EQV
¬ NOT
∨ OR
⊗ XOR
∞ INF
ε IN
| SUCH THAT
≠ NEQ
≤ LEQ
≥ GEQ
{ SETO "set open"
} SETC "set close"
∪ UNION
∩ INTER
` ASSOC for derived sets
↔ SWAP
_ ! alternate underline
Arithmetic Constants
11-13.
12369 is an Integer with decimal value 12369
'12357 is an Integer constant with octal value 12357
123. is a Real constant with floating point value 123.0
0123.0 is a Real constant with floating point value 123.0
.524 is a Real constant with floating point value 0.524
5.3@4 is a Real constant with floating point value 53000.0
5.342@-3 is a Real constant with value 0.005342
11-14. The character ' (right quote) precedes a string of digits
to be converted into an OCTAL number.
SAILON NO. 57.1 SAIL 12-0
EXECUTION TIME ROUTINE OPTIONS
12-0. The Execution Time routines are available in many forms:
a. As a single file, RUNTIM.REL (not advised)
b. As a library of one-segment (low) files, LIBSAI.REL
c. As a library of HISEG files, HLBSAI.REL (for use with
programs compiled using /H)
d. As a sharable segment containing all the routines (SAISG1.SHR).
Methods for using and creating these files are described in detail
in the SAILmaker's Guide, which accompanies this manual. You should
ignore descriptions of the form of the runtimes (library, segment,
etc.) throughout the remainder of the manual; the definitive word
shall be found in the SAILmaker's Guide. This guide is on the
distribution tape as TELLEM.
SAILON NO. 57.1 SAIL 12-3
Function:
12-7. SAIL input/output operates at a very low level in the
following sense: the operations necessary to obtain devices, open and
close files, etc., are almost directly analogous to the system calls
used in assembly language. OPEN is used to associate a channel
number (0 to '17) with a device, to determine the data mode of the
I/O to occur on this channel (character mode, binary mode, dump mode,
etc.), to specify storage requirements for the data buffers used in
the operations, and to provide the system with information to be used
for input operations.
CHANNEL is a user-provided channel number which will be used in
subsequent I/O operations to identify the device. CHANNEL may
range from 0 to 15 ('17). If some file is already open on
this channel, a RELEASE will be performed for that channel
before the OPEN is executed.
DEVICE must be a String (i.e. "TTY", "DATA") which is recognizable
by the system as a physical or logical device name.
MODE is the data mode for the I/O operation. MODE 0 will always
work for characters ( see Input, 12-40 and Out, 12-45). Modes
8 ('10) and 15 ('17) are applicable for binary and dump-mode
operations using the functions WORDIN, WORDOUT, ARRYIN, or
ARRYOUT (see Wordin, 12-48 and following). For other data
modes, see [Moorer].
If any of bits 18-21 are on in the MODE word, the I-O routines
will not print error messages when data errors occur which
present the corresponding bits as a response to the GETSTS
UUO. Instead, the GETSTS bits will be reported to the user as
described under EOF below. If bit 23 is on, no error message
will be printed if an invalid file name specification is
presented to LOOKUP, ENTER, or RENAME, a code identifying the
problem will be returned (see Lookup, Enter, 12-17 and
following, Rename, 12-21 for details). If you don't
understand any of this, leave all non-mode bits off in the
MODE word.
SAILON NO. 57.1 SAIL 12-4
NUMBER_OF{INPUT/OUTPUT}_BUFFERS specifies the number of buffers to be
reserved for the I/O operations (see [Moorer] for details).
At least one buffer must be specified for input if any input
is to be done in modes other than '17; similarly for output.
If data is only going one direction, the other buffer
specification should be 0. Two buffers give reasonable
performance for most devices (1 is sufficient for a TTY, more
are required for DSK if rapid operation is desired).
The left half of the BUFFER parameter, if non-zero, specifies
the buffer size for the I/O buffers. Use this only if you
desire non-standard sizes.
12-8. The remaining arguments are applicable only for INPUT
(String input). They will be ignored for any other operations
(although their values may be changed by the Open function).
COUNT designates a variable which will contain the maximum number
of characters to be read from "DEVICE" in a given INPUT
call (see Input, 12-40, Breakset, 12-22). Fewer characters
may be read if a break character is encountered or if an
end of file is detected. The count should be a variable or
constant (not an expression), since its address is stored,
and the temporary storage for an expression may be re-used.
BRCHAR designates a variable into which the break character (see
INPUT and BREAKSET again) will be stored. This variable
can be tested to determine which of many possible
characters terminated the read operation.
SAILON NO. 57.1 SAIL 12-4.5
EOF designates a variable to be used for two purposes:
1) If EOF is 0 when OPEN is called, a SAIL error message will
be invoked if the device is not available. The user will
be given the options of retrying or terminating the
operation. If EOF is non-zero when OPEN is called, it will
be set to 0 if the OPEN is successful. Otherwise it will
not be changed. In this case (EOF non-zero on entry)
control will be returned to the user. This flag may then
be tested.
2) EOF will be made non-zero (TRUE) if an end of file
condition, or any error condition among those enabled (see
MODE, above) is detected during any SAIL input/output
operation. It will be 0 (FALSE) on return to the user
otherwise. Subsequent inputs after an EOF return will
return non-zero values in EOF and a null String result for
INPUT. For ARRYIN , a 0 is returned as the value of the
call after end of file is detected. If EOF is TRUE after
such an operation, it will contain the entire set (18 bits)
of GETSTS information in the left half. The EOF bit is
'20000, and is the only one you'll ever see if you haven't
specially enabled for others. A summary of the enable
bits, the EOF and error bits, and their meanings is
contained in the Appendix NON-FATAL ERROR, EXCEPTIONAL
CONDITION RETURN CODES, 18-11.
SAILON NO. 57.1 SAIL 12-7.5
12-19.5 An additional return code, '10, has been added to the
error return possibilities from LOOKUP, ENTER, and RENAME.
This code indicates that the punctuation or syntax of the file
name string was invalid. This code will be returned only if
the appropriate enable bit ('10000) was on in the MODE word at
OPEN time (see Open). It is possible that this code conflicts
with some recent DEC additions. For that I am sorry.
SAILON NO. 57.1 SAIL 12-13.5
NOTE CONCERNING EOF VARIABLE, ERROR CONDITIONS
12-39.5. In the Input Function whose description follows, an in all
subsequent I/O operation descriptions, you should amend any comments
concerning the value of the EOF variable to include possible error
conditions (if you are enabled for errors, you must specifically
check for the end of file bit). The full description of the changes
can be gleaned from the description of Open, 12-6, and from the
error condition summaries in Section 18. The changes should rightly
be distributed to all I/O discussions. Maybe some day they will.
SAILON NO. 57.1 SAIL 12-27
Function:
12-82. The decimal Integer representation of VALUE is produced as
an ASCII String with leading zeroes omitted (unless WIDTH has been
set by Setformat, 12-75 to some negative value). "-" will be
concatenated to the String representing the decimal absolute value of
VALUE if VALUE is negative.
Cvos
Form:
12-83. "ASCII_STRING" ← CVOS ( VALUE );
Function:
12-84. The octal Integer representation of VALUE is produced as an
ASCII String with leading zeroes omitted (unless WIDTH has been set
to some negative value by Setformat, 12-75). No "-" will be used to
indicate negative numbers. For instance, -5 will be represented as
"777777777773".
Cvis
Form:
12-85. "STRING" ← CVIS ( ITEM , @FLAG ) ;
Function:
12-86. The print name of ITEM is returned as a string. An Item's
print name is the identifier used to declare it, or that provided by
the NEW_PNAME function (see New_Pname, 12-88). FLAG is set to FALSE
(0) if the appropriate string is found. Otherwise it is set to TRUE
(-1), and you should not place great faith in the string result.
SAILON NO. 57.1 SAIL 12-28
Cvsi
Form:
12-87. ITEM ← CVSI ( "PNAME" , @FLAG ) ;
Function:
12-88. The Item whose identifier (or name provided by New_Pname,
12-88.2) is the same as the string argument. PNAME is returned and
FLAG set to FALSE if such an Item exists. Otherwise, something very
random is returned, and FLAG is set to TRUE.
New_Pname
Form:
12-88.2
NEW_PNAME (ITEM , "STRING" )
Function:
12-88.4 This function assigns to the Item the name "STRING". Don't
perform this twice for the same Item without first deleting the
previous one. The corresponding name or Item may be retrieved using
CVIS or CVSI (above). You must use the REQUIRE n PNAMES construct in
one of the files comprising your program for all this to work.
Del_Pname
Form:
12-88.6
DEL_PNAME ( ITEM )
SAILON NO. 57.1 SAIL 12-28.5
Function:
12-88.8 This function deletes any string PNAME associated with this
Item.
Cve, Cvf, Cvg
Form:
12-89.
"STRING" ← CVE ( VALUE ); "STRING" ← CVF ( VALUE ); "STRING" ← CVG (
VALUE );
Function:
12-90. Real number output is facilitated by means of one of three
functions CVE,CVG, or CVF, corresponding to the E,G, and F formats of
FORTRAN IV. Each of these functions takes as argument a real number
and returns a string. The format of the string is controlled by
another function SETFORMAT ( WIDTH,DIGITS) (see Setformat, 12-75)
which is used to change WIDTH from zero and DIGITS from 7, their
initial values. WIDTH specifies the minimum string length. If WIDTH
is positive leading blanks will be inserted and if negative leading
zeros will be inserted.
12-91. The following table indicates the strings returned for some
typical numbers. _ indicates a space and it is assumed that WIDTH←10
and DIGITS←3.
CVF CVE CVG
______.000 __.100@-3_ __.100@-3_
______.001 __.100@-2_ __.100@-2_
______.010 __.100@-1_ __.100@-1_
______.100 __.100____ __.100____
_____1.000 __.100@1__ __1.00____
____10.000 __.100@2__ __10.0____
___100.000 __.100@3__ __100.____
__1000.000 __.100@4__ __.100@4__
SAILON NO. 57.1 SAIL 12-32.5
12-107.5 The global variable _SKIP_ (accessed by declaring it as
EXTERNAL INTEGER _SKIP_) will be 0 if no errors occurred, ≠0 if an
invalid file name specification is presented.
SAILON NO. 57.1 SAIL 12-34.5
Usercon
Form:
12-117.2
USERCON ( @INDEX , @VALUE , FLAG )
Function:
12-117.4 This function allows inspection and alteration of the
"User Table" (see User Table, 17-1). Declare an index you are
interested in as an External Integer (e.g., EXTERNAL INTEGER REMCHR).
This will, when loaded, give an address which is secretly a small
Integer index into the User Table. When passed by reference, this
index is available to USERCON. The names and meanings of the various
User Table indices can be found in the file HEAD, wherever SAIL
compiler program text files are sold.
12-117.6 USERCON always returns the current value of the
appropriate User Table entry (the Global Upper Segment Table is used
if FLAG is negative and your system knows about such things). If
FLAG is odd, the contents of VALUE before the call replaces the old
value in the selected entry of the selected table.
12-117.8 By now the incredible danger of this feature must be
apparent to you. Be sure you understand the ramifications of any
changes you make to any User Table value.
SAILON NO. 57.1 SAIL 14-6.5
K If a listing file is also specified, it is written in a
special format. In addition, when the object program
runs, it will generate a special file whose name is the
same as the listing file name, and whose extension is
.KNT. These files may later be merged using the PROFIL
program to obtain execution counts for each line of the
program. More details will be found in the document
NEWMAN, which lists recent changes. NEWMAN is appended
to this document, and is contained on the distribution
tape.
H If this switch is on, and your installation supports
the feature, SAIL will generate a TWOSEG pseudo-op in
the beginning of the .REL file, and will thereafter
generate its output such that the code and constants
will be loaded into the upper segment, the data into
the lower. When the program is SSAVEd after loading,
it will constitute a sharable (re-entrant) program.
This feature is useful only if the program will be used
on a production basis, so that sharing becomes likely.
Again, see NEWMAN for more details.
SAILON NO. 57.1 SAIL 18-1
SECTION 18
APPENDIX -- USEFUL SUMMARIES
ARITHMETIC TYPE-CONVERSION TABLE
18-1.
OPERATION ARG1 ARG2 ARG1' ARG2' RESULT
+ - INT INT INT INT INT*
* ↑ % REAL INT REAL REAL REAL
MAX MIN INT REAL REAL REAL REAL
REAL REAL REAL REAL REAL
LAND LOR INT INT INT INT INT
EQV XOR REAL INT REAL INT REAL
INT REAL INT REAL INT
REAL REAL REAL REAL REAL
LSH ROT INT INT INT INT INT
REAL INT REAL INT REAL
INT REAL INT INT INT
REAL REAL REAL INT REAL
/ INT INT REAL REAL REAL
REAL INT REAL REAL REAL
INT REAL REAL REAL REAL
REAL REAL REAL REAL REAL
MOD DIV INT INT INT INT INT
REAL INT INT INT INT
INT REAL INT INT INT
REAL REAL INT INT INT
* Unless ARG2 is <0 for the operator ↑
SAILON NO. 57.1 SAIL 18-2
SAIL RESERVED WORDS
18-2.
ABS AND ANY ARRAY ARRAY_PDL ASSOC BBPP BEGIN BOOLEAN CASE COMMENT
CONTINUE COP CVI CVN DATUM DEFINE DELETE DIV DO DONE DPB ELSE END
ENTRY EQV ERASE EXTERNAL FALSE FIRST FOR FOREACH FORTRAN FORWARD FROM
GEQ GLOBAL GO GOTO IBP IDPB IF ILDB IN INF INTEGER INTER INTERNAL
ISTRIPLE ITEM ITEMVAR LABEL LAND LDB LENGTH LEQ LET LIBRARY
LOAD_MODULE LNOT LOP LOR LSH MAKE MAX MESSAGE MIN MOD NEEDNEXT NEQ
NEXT NEW NEW_ITEMS NOT NULL OF OR OWN PHI PNAMES PRELOAD_WITH
PROCEDURE PUT QUICK_CODE REAL RECURSIVE REFERENCE REMOVE REQUIRE
RETURN ROT SAFE SECOND SEGMENT_NAME SEGMENT_FILE SET SETC SETO SHORT
START_CODE STEP STRING STRING_PDL STRING_SPACE SOURCE_FILE SUCH SWAP
SYSTEM_PDL THAT THEN THIRD TO TRUE UNTIL VALUE WHILE XOR
SAIL PRE-DECLARED IDENTIFIERS
18-3.
ARRBLT ARRINFO ARRTRAN ARRYIN ARRYOUT BACKUP BREAKSET CALL CLOSE
CLOSIN CLOSO CLRBUF CODE CVASC CVD CVE CVF CVFIL CVG CVIS CVO CVOS
CVS CVSI CVSIX CVSTR CVXSTR ENTER EQU FILEINFO GETCHAN GETFORMAT
INCHRW INCHRS INCHSL INCHWL INSTR INSTRL INSTRS INPUT INTIN INTSCAN
LINOUT LODED LOOKUP MTAPE OPEN OUT OUTCHR OUTSTR PTCHRS PTCHRW PTIFRE
PTOCNT PTOCHS PTOCHW PTOSTR PTYALL PTYGET PTYIN PTYREL PTYSTR REALIN
REALSCAN RELEASE RENAME SCAN SETBREAK SETFORMAT STRBRK TTYIN TTYINL
TTYINS WORDIN WORDOUT USERCON USERERR USETI USETO
SAILON NO. 57.1 SAIL 18-3
CHARACTER-IDENTIFIER EQUIVALENCES
18-4.
CHARACTER RESERVED WORD
∧ AND
≡ EQV
¬ NOT
∨ OR
⊗ XOR
∞ INF
ε IN
| SUCH THAT
≠ NEQ
≤ LEQ
≥ GEQ
{ SETO
} SETC
∪ UNION
∩ INTER
` ASSOC
↔ SWAP
_ !
SAILON NO. 57.1 SAIL 18-4
PARAMETERS TO THE OPEN FUNCTION
18-5.
CHANNEL System Data Channel, 0-'17
DEVICE string giving device name
MODE data mode, bits 18-21, 23 enable error returns
INBUFS number of input buffers, lh buffer size if ≠0
OUTBUFS number of output buffers
COUNT text input count (reference)
BRCHAR break char variable (reference)
EOF end-of-file and IO error flag (reference)
SAILON NO. 57.1 SAIL 18-5
BREAKSET MODES
18-6.
I (Inclusion) string is set of break chars
X (eXclusion) string of all non-break chars
O (Omit) string of characters to be omitted from result
S (skip) break char appears only in BRCHAR variable
A (Append) break char is last char of result string
R (Retain) break char is first char of next string
P (Pass) line numbers appear in input without warning
N (No numbers) line numbers and the tabs that follow them
are removed.
L (Line no break) line numbers cause input break. BRCHAR
is negative. Next input gets line no characters.
E (Erman) line numbers cause input break. Negated line no
returned in BRCHAR. Line no removed from input.
D (Display) after this appears, each line no is listed on
the display (if TTY is a DPY) as it is dealt with.
SAILON NO. 57.1 SAIL 18-6
MTAPE COMMANDS
18-7.
MODE FUNCTION
"A" Advance past one tape mark (or file)
"B" Backspace past one tape mark
"F" Advance one record
"R" Backspace one record
"W" Rewind tape
"E" Write tape mark
"U" Rewind and unload
SAILON NO. 57.1 SAIL 18-7
COMMAND SWITCHES
18-8.
D double size of define pushdown stack
numL listing control -- num>0 becomes listing starting addr.
num=-1 starts listing after current DDT size. num=-2
starts listing after current RAID size.
numM initial debugging mode set to num
P double size of system pushdown list
Q double size of string pushdown list
R double size of parse pushdown list
numS set size of string space to num
C create CREF (cross-reference) input file.
numF enable various listing formats.
K (requires listing file) -- issue special listing file and
code to create .KNT file after object program execution
for later use with the PROFIL program analyzer.
H object code will be loaded and run in two segments. The
upper segment may be shared, making some savings possible.
DEBUGGING MODES
18-9.
1 display before executing each code generation routine
2 don't display, but remain enabled for asynchronous and
line breaks
3 display before each production is compared
4 continue from type 1 and 3 modes automatically
5 just display input file as it goes past
6 disable debugging mechanism (started in this mode unless
an M switch appears).
SAILON NO. 57.1 SAIL 18-8
VALID RESPONSES TO ERROR MESSAGES
18-10.
CR (carriage return) try to continue
LF (line feed) continue automatically -- don't stop for
user go-ahead after each message
S restart
X exit -- close all files, return to monitor
L look at stacks -- of interest only to compiler fixers
E edit. Follow by CR to get file the compiler is working
on (or last thing edited, for runtime routines). Follow
with <name> CR to edit <name>.
D go to DDT or RAID
SAILON NO. 57.1 SAIL 18-9
NON-FATAL ERROR, EXCEPTIONAL CONDITION RETURN CODES
18-11.
ROUTINE CODE LOCATION CONDITIONS, CODE VALUES
CALL _SKIP_ set TRUE if the UUO skips, FALSE otherwise
CODE _SKIP_ set TRUE if the constructed instruction
skips, FALSE otherwise
CVFIL _SKIP_ set TRUE if the file input is invalidly
specified (wrong punctuation, order, etc.),
FALSE otherwise.
CVIS FLAG param set TRUE if no PNAME exists for this Item,
FALSE if CVIS succeeds.
CVSI FLAG param set TRUE if no Item exists with this String
as PNAME, FALSE if CVSI succeeds.
ENTER FLAG param set FALSE if the ENTER succeeds. Otherwise,
the left half is made -1. Then if the file
name was invalid, the right half is made
'10. Otherwise it is set to some code from
0 to 7, depending on the type of ENTER
failure. These codes are the same as the
ENTER UUO codes in [Moorer]. If error '10
(invalid spec.) is returned, an error
message (non-fatal) will also be printed,
unless you are enabled for user handling of
this error (see I/O below).
GETCHAN result <0 if no channel is available.
INCHRS result <0 if no characters are waiting.
INCHSL FLAG param ≠0 if no characters are waiting.
INSTRS FLAG param ≠0 if no characters are waiting.
SAILON NO. 57.1 SAIL 18-10
I/O EOF vbl. 0 if no exceptional conditions occurred in
an I/O operation. Otherwise, the left half
has certain bits turned on, indicating the
error: 400000 is a catchall -- improper
mode.
200000 means parity error occurred.
100000 means a data error occurred.
40000 means "Record number out of bounds".
20000 means End of File (input only).
You are always enabled for bit 20000 (EOF).
However, to be allowed to handle any of the
others, you must turn on the corresponding
bit in the right half of the MODE word in
the OPEN for this channel. In addition, the
10000 bit is used to enable user handling of
invalid file specifications to ENTER,
LOOKUP, and RENAME (see above). '7500017 in
the MODE parameter would enable a dump mode
file for user handling of ALL I/O errors on
this channel. If you are not enabled for a
given error, an error message (which may or
may not be fatal) will be printed, and the
error code word set as indicated. In
addition, the number of words actually
transferred is stored in the right half of
this variable for ARRYIN, ARRYOUT.
LOOKUP FLAG param same as ENTER.
OPEN EOF vbl if 0 on entry, prints fatal error message if
OPEN fails. If ≠0 on entry, always returns
to user -- still ≠0 if OPEN failed, 0 if it
succeeded.
RENAME FLAG param same as ENTER.
TTYINS FLAG param same as INSTRS.
SAILON NO. 57.1 SAIL 18-11
substrings _SKIP_ consider ST[X TO Y]. If Y>LENGTH(ST), Y←
LENGTH(ST). If Y<0, Y←0; rh(_SKIP_)←-1 with
both. If X<1, X←1. If X>Y it is set to
Y+1 (guaranteeing a null String result). In
either case, lh(_SKIP_) is set to -1. The
ST[X FOR Y] case is first converted to the
other case, then executed.
You should also refer to the table for Input, 12-40, describing the
various combinations of the BRCHAR and EOF
variables and their meanings.
SUGGESTED CHANGES TO THE FAIL MANUAL.
These are not formal as was the case with SAIL, because it seemed
prudent to leave the method of modification up to you.
A. The version of FAIL on this tape has the TWOSEG and HISEG
pseudo-ops implemented. These behave identically to those in
MACRO, except that it is mandatory that they appear before any
instructions which cause code to be generated.
B. The LINK, LINKEND descriptions are terribly inadequate -- a shame,
because it's such a nice feature. I suggest that 2.4.16 be expanded
as follows, and that space be created by deleting parts 2, 3, and 5
of section 2.5, since these are Stanford-specific, and we already
have a manual.
****************
2.4.16 LINK-LINKEND
This feature provides a convenient non-symbolic communication method
between possibly independent assemblies.
LINK n,loc (0≤n≤17)
causes the Loader to place loc at the head of a linked list identified
by n (the previous list value for n is placed in loc, and the address
of loc is saved for list n).
LINKEND n,locend
directs the Loader to place the final address saved for list n in
locend, but only after loading is complete (therefore the order in
which the LINKs and the (single) LINKEND appear is unimportant).
Both loc and locend should be assembled as 0's. Locend may be used
at run time to access data adjacent to each loc which was LINKed to
list n.
**************
Isn't that nice?
Stanford AI Project
Computer Science Dept.
Stanford University
Stanford, Ca., 94305
16 September, 1971
(415) 321-2300 (x4971)
Ms. I. Ferne Halley
Digital Equipment Computer Users Society
Maynard, Mass. 01754
Dear Ms. Halley:
Under separate cover I have sent tapes, listings, and miscellaneous
paraphernalia representing the new SAIL system. Before I get to the
details of just what you're in for, I'd like to express my appreciation
for the help you've given me in this effort. Your SAIL manual (which,
by the way, arrived within two days after we talked) is of impressive
quality, with better contrast and paper quality than our latest offering.
I hope that what I've sent will allow you to upgrade the system with
minimum effort.
The listings represent revisions to previous documentats, or complete
replacements to a couple of them. The SAIL manual changes are done
as replacements to existing pages (the page numbers are indicated to
the right. There are cases where an insertion should go between the
pages printed on the same piece of paper. The choice of reprinting
the entire sheet, then printing the old back page on a new sheet, or
simply inserting the new page out of order is up to you. There are only
about thirty pages of changes; the resulting manual (along with NEWMAN)
represents totally up to date documentation.
NEWMAN is a description of a few changes which have not made their way
into the manual yet. It should replace a similar document in the old manual as shown on
the listing. TELLEM is a much-improved version of the implementation guide
found on pages 199-215 of the manual you sent; unfortunately, it is about
40 pages long. Sorry about that.
I have only indicated what sort of changes should be made in the FAIL
manual, since it was apparent that changes had been inserted there before
and I decided you might want control over the format. There are only a
couple of changes, but I think they are fairly important ones.
The cover letter should replace page 2 of the manual. Feel free to retype
it with modifications to suit your policy -- especially if you're not geared
for receiving bug reports, etc. In the latter case, shift them over to
me (us?). I thought some sort of general introduction of that nature was
needed there, though.
The magnetic tape I have sent is recorded at 556 bpi, on 7 tracks. It contains
everything anyone will need to implement a SAIL system, and somewhat more
in addition. The first few pages of the TELLEM document are devoted to the
retrieval of these files to disk. You should use the same procedures to
do any testing, or to distribute the system on DECTAPE. Once you have retrieved
SAVE.SAV using GETSAV, you should probably keep it in some convenient place
for future use.
To distribute SAIL on mag tape, you should use the COPY.MAC program, provided
on paper tape. It will copy a tape from MTA0: to MTA1:, as described in the
hard-copy listing. There is no reason to send this program to anyone else.
However, in addition to the other documents, the magtape user should be sent
the GETSAV listing and paper tapes.
If you distribute any DECtape systems, there are some files you should probably
leave out, to save tapes, since they are of marginal utility. Referring to
the parts list in TELLEM, they are:
GETSAV (of course), SAVE, SAVE.SAV, LOADER.052 (any Loader should work),
FAIL.ON, SAIL.ON
Send only PROFIL.SAI and SCNSER.SAI from the second group of files.
These files still will occupy four or five DECtapes.
We really don't have a mechanism for giving away or selling tapes, so I
guess I should ask you to send ours (or one like it) back. That will give
you a good opportunity to test the COPY program.
A couple of things come for free with this system. In particular, this version
of FAIL, and the document with the indicated changes, represent the very
latest we have of this program, including TWOSEG and HISEG. In addition, the
CREF on the tape is the newest we have of that (it handles block structure
as created by FAIL and SAIL). You might want to upgrade your files for these
programs, too.
I have to confess to ignorance of some of your services. In particular, people
often ask me for multiple copies of the SAIL manual (for classes, etc.). We
have no mechanism for helping them. Are the manuals you publish available in
quantity (presumably at some happily outlandish charge)? If not, could something
be arranged if the demand becomes great enough? I am also curious about your
willingness to collect complaints from users, and distribute their fixes to
current users of the system, and that sort of thing.
Again, thank you very much for your help. This thing has gotten quite beyond
my ability to keep up with it. Please let me know if I can do something else
to aid in the distribution of SAIL.
Sincerely,
Dan Swinehart